package com.atguigu.rabbitmq.demo.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
@Slf4j
public class MyCallBack implements RabbitTemplate.ConfirmCallback {

    @Autowired
    private RabbitTemplate rabbitTemplate;
    //注入
    @PostConstruct //这个注解是在其他注解完成后才执行
    public void init(){
        rabbitTemplate.setConfirmCallback(this);
        /*先执行@Component，再执行@Autowired，最后执行@PostConstruct*/
    }

    /**
     * 交换机确认回调方法(成功或失败都要调这个方法)
        1.发消息 交换机接收到了 回调
         1.1 correlationData：保存回调的消息的ID及相关信息
         1.2 b:接收到消息，第二个参数就是true
         1.3 s：第三个参数是失败的原因，如果成功了，第三个参数就是null
        2.发消息 交换机接收失败了 回调
         1.1 correlationData：保存回调的消息的ID及相关信息
         1.2 b:接收失败，第二个参数就是false
         1.3 s：第三个参数是失败的原因
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean b, String s) {
        String id = correlationData != null ? correlationData.getId() : "";
        if (b){//成功了
            log.info("交换机已经收到了ID为：{}的消息",id);
        }else {
            log.info("交换机还未收到ID为：{}的消息,原因是：{}",id,s);
        }
    }
}
